package com.itheima.tlais_web_management.interceptor;


import com.alibaba.fastjson.JSONObject;
import com.itheima.tlais_web_management.pojo.Result;
import com.itheima.tlais_web_management.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
//@Component//拦截器
//拦截器 只拦截spring环境中的资源 — — — — spring 提供的
public class LoginCheckinterceptor implements HandlerInterceptor {

    /**
     * 第一步：定义拦截器
     * 第二部：配置拦截器
     * @param handler
     * @return
     * @throws Exception
     */

    @Override//目标资源方法运行前运行，true放行，flase不放行
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        System.out.println("preHandle 执行了");
        //判断是否为登录请求

        //1获取请求对象 url
        String url = req.getRequestURL().toString();
        log.info("url为{}",url);
        //2进行判断，看是否为登录操作
        if (url.contains("login")){
            log.info("正在进行登录操作，放行");

            return true;
        }
        //3获取请求头中的令牌（token）
        String jwt = req.getHeader("token").toString();
        //4先判断令牌是否存在
        if (!StringUtils.hasLength(jwt)){
            log.info("查不到请求头，登录失败");
            Result error = Result.error("NOT_LOGIN");
            //使用alibaba社区JSON转换工具手动转换
            String jsonString = JSONObject.toJSONString(error);
            resp.getWriter().write(jsonString);
            return false;
        }
        //5解析令牌 token
        try {
            //解析过程中令牌报错则表示令牌非法
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析失败，登录失败");
            Result error = Result.error("NOT_LOGIN");
            //使用alibaba社区JSON转换工具手动转换
            String jsonString = JSONObject.toJSONString(error);
            resp.getWriter().write(jsonString);
            return false;
        }
        //6放行
        log.info("令牌合法，放行");
        return true;
    }

    @Override//目标资源方法运行后运行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle执行了");
    }

    @Override//视图渲染完毕后运行，最后运行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion执行了");
    }
}
